package com.ruoyi.lock.service.impl;

import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.lock.domain.ATenantkey;
import com.ruoyi.lock.domain.ATenantuser;
import com.ruoyi.lock.mapper.ADeviceMapper;
import com.ruoyi.lock.mapper.ATenantkeyMapper;
import com.ruoyi.lock.mapper.ATenantuserMapper;
import com.ruoyi.lock.service.IATenantkeyService;
import com.ruoyi.lock.service.IATenantuserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Date;
import java.util.Calendar;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 租户信息Service业务层处理
 *
 * @author arvin
 * @date 2025-03-06
 */
@Service
public class ATenantuserServiceImpl implements IATenantuserService
{
    private static final Logger logger = LoggerFactory.getLogger(ATenantuserServiceImpl.class);

    @Autowired
    private ATenantuserMapper aTenantuserMapper;
    @Autowired
    private ADeviceMapper aDeviceMapper;
    @Autowired
    private ATenantkeyMapper aTenantkey;
    @Autowired
    private IATenantkeyService aTenantkeyService;
    /**
     * 查询租户信息
     *
     * @param id 租户信息主键
     * @return 租户信息
     */
    @Override
    public ATenantuser selectATenantuserById(Long id)
    {
        return aTenantuserMapper.selectATenantuserById(id);
    }
    @Override
    public ATenantuser selectATenantuserById2(Long id)
    {
        return aTenantuserMapper.selectATenantuserById2(id);
    }
    @Override
    public ATenantuser selectATenantuserByIdRuzhu(ATenantuser aTenantuser)
    {
        return aTenantuserMapper.selectATenantuserByIdRuzhu(aTenantuser);
    }

    /**
     * 查询租户信息列表
     *
     * @param aTenantuser 租户信息
     * @return 租户信息
     */
    @DataScope(deptAlias = "d")
    @Override
    public List<ATenantuser> selectATenantuserList(ATenantuser aTenantuser)
    {
        return aTenantuserMapper.selectATenantuserList(aTenantuser);
    }
    @Override
    public List<ATenantuser> selectATenantuserList3(ATenantuser aTenantuser)
    {
        return aTenantuserMapper.selectATenantuserList3(aTenantuser);
    }  @Override
    public List<ATenantuser> selectATenantuserListRuZhu(ATenantuser aTenantuser)
    {
        return aTenantuserMapper.selectATenantuserListRuZhu(aTenantuser);
    }

    @Override
    @DataScope(deptAlias = "d")
    public List<ATenantuser> selectATenantuserListNotRuZhu(ATenantuser aTenantuser) {
        return aTenantuserMapper.selectATenantuserListNotRuZhu(aTenantuser);
    }

    /** 男女数量 */
    @Override
    @DataScope(deptAlias = "d")
    public com.alibaba.fastjson.JSONObject selectSexCount(ATenantuser aTenant) {
        return aTenantuserMapper.selectSexCount(aTenant);
    }

    /**
     * 新增租户信息
     *
     * @param aTenantuser 租户信息
     * @return 结果
     */
    @Override
    public int insertATenantuser(ATenantuser aTenantuser)
    {
        // 校验身份证号唯一性
//        if (checkIdCardNumberUnique(aTenantuser) != null) {
//            throw new ServiceException("新增租户失败，卡号已存在");
//        }

        aTenantuser.setCreateTime(DateUtils.getNowDate());
        return aTenantuserMapper.insertATenantuser(aTenantuser);
    }

    /**
     * 修改租户信息
     *
     * @param aTenantuser 租户信息
     * @return 结果
     */
    @Override
    public int updateATenantuser(ATenantuser aTenantuser)
    {

        aTenantuser.setUpdateTime(DateUtils.getNowDate());
        return aTenantuserMapper.updateATenantuser(aTenantuser);
    }

    /**
     * 批量删除租户信息
     *
     * @param ids 需要删除的租户信息主键
     * @return 结果
     */
    @Override
    public int deleteATenantuserByIds(Long[] ids)
    {
        // 检查每个租户是否有未删除的钥匙
        for (Long id : ids) {
            checkTenantKeyExists(id);
        }
        return aTenantuserMapper.deleteATenantuserByIds(ids);
    }

    /**
     * 删除租户信息信息
     *
     * @param id 租户信息主键
     * @return 结果
     */
    @Override
    public int deleteATenantuserById(Long id)
    {
        // 检查租户是否有未删除的钥匙
        checkTenantKeyExists(id);
        return aTenantuserMapper.deleteATenantuserById(id);
    }

    /**
     * 检查租户是否有未删除的钥匙
     *
     * @param tenantId 租户ID
     */
    private void checkTenantKeyExists(Long tenantId)
    {
        // 创建查询条件
        ATenantkey query = new ATenantkey();
        query.setTenantId(tenantId);

        // 查询该租户的钥匙列表
        List<ATenantkey> keys = aTenantkeyService.selectATenantkeyList3(query);

        // 如果存在钥匙记录，则不允许删除租户
        if (keys != null && !keys.isEmpty()) {
            throw new RuntimeException("该租户存在未删除的钥匙，请先删除钥匙再进行操作");
        }
    }

    /**
     * 校验身份证号码是否唯一
     *
     * @param aTenantuser 租户信息
     * @return 返回结果
     */
    private ATenantuser checkIdCardNumberUnique(ATenantuser aTenantuser)
    {
        String idCardNumber = aTenantuser.getIdCardNumber();
        if (idCardNumber == null || idCardNumber.isEmpty()) {
            return null;
        }

        // 创建查询条件
        ATenantuser query = new ATenantuser();
        query.setIdCardNumber(idCardNumber);

        // 查询符合条件的租户列表
        List<ATenantuser> list = aTenantuserMapper.selectATenantuserList3(query);

        return list != null && !list.isEmpty() ? list.get(0) : null;
    }

    /**
     * 校验手机号码是否唯一
     *
     * @param aTenantuser 租户信息
     * @return 返回结果
     */
    private ATenantuser checkPhoneUnique(ATenantuser aTenantuser)
    {
        String phone = aTenantuser.getPhone();
        if (phone == null || phone.isEmpty()) {
            return null;
        }

        // 创建查询条件
        ATenantuser query = new ATenantuser();
        query.setPhone(phone);

        // 查询符合条件的租户列表
        List<ATenantuser> list = aTenantuserMapper.selectATenantuserList3(query);

        return list != null && !list.isEmpty() ? list.get(0) : null;
    }

    /**
     * 根据手机号查询用户信息
     *
     * @param phone 手机号
     * @return 用户信息
     */
    @Override
    public ATenantuser selectATenantuserByPhone(String phone)
    {
        return aTenantuserMapper.selectATenantuserByPhone(phone);
    }

    /**
     * 根据房间ID查询设备信息
     *
     * @param homeId 房间ID
     * @return 设备信息
     */
    @Override
    public java.util.Map<String, Object> selectDeviceInfo(Long homeId)
    {
        return aTenantuserMapper.selectDeviceInfo(homeId);
    }

    /**
     * 查询租户基本信息
     *
     * @param userId 租户ID
     * @return 租户基本信息
     */
    @Override
    public ATenantuser selectTenantBasicInfo(Long userId)
    {
        return aTenantuserMapper.selectTenantBasicInfo(userId);
    }

    /**
     * 查询入住人员性别统计
     *
     * @param aTenantuser 查询条件
     * @return 性别统计
     */
    @Override
    public com.alibaba.fastjson.JSONObject selectLivingSexCount(ATenantuser aTenantuser)
    {
        return aTenantuserMapper.selectLivingSexCount(aTenantuser);
    }

    /**
     * 根据身份证号列表批量查询租户信息
     * 
     * @param idCardNumbers 身份证号列表
     * @return 租户信息列表
     */
    @Override
    public List<ATenantuser> selectATenantuserByIdCardNumbers(List<String> idCardNumbers)
    {
        if (idCardNumbers == null || idCardNumbers.isEmpty()) {
            return new java.util.ArrayList<>();
        }
        return aTenantuserMapper.selectATenantuserByIdCardNumbers(idCardNumbers);
    }
    
    /**
     * 查询用户表中最大的s_update_time时间
     * @return 最大的s_update_time时间
     */
    @Override
    public Date getMaxSUpdateTime() {
        try {
            Date maxTime = aTenantuserMapper.selectMaxSUpdateTime();
            if (maxTime != null) {
                logger.info("查询到最大s_update_time: {}", maxTime);
                return maxTime;
            } else {
                logger.info("未查询到s_update_time数据");
                return null;
            }
        } catch (Exception e) {
            logger.error("查询最大s_update_time失败", e);
            return null;
        }
    }

}